home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / unix / src / access.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-14  |  808 b   |  36 lines

  1. #include "amiga.h"
  2. #include <utility/tagitem.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5.  
  6. int access(char *name, int mode)
  7. {
  8.   struct FileInfoBlock *fib;
  9.   BPTR lock = 0;
  10.   int ret = -1;
  11.  
  12.   chkabort();
  13.   if ((fib = AllocDosObjectTags(DOS_FIB, TAG_END)) &&
  14.       (lock = Lock(name, ACCESS_READ)) &&
  15.       Examine(lock, fib))
  16.     {
  17.       struct stat sbuf;
  18.       int fmode;
  19.       BPTR parent = ParentDir(lock);
  20.       int isroot = !parent;
  21.  
  22.       if (parent) UnLock(parent);
  23.       _fibstat(fib, isroot, &sbuf);
  24.       fmode = (sbuf.st_mode & (S_IREAD | S_IEXEC)) >> 6 |
  25.     (sbuf.st_mode & (S_IWRITE >> 3)) >> 3;
  26.  
  27.       if ((fmode & mode) == mode) ret = 0;
  28.       else errno = EACCES;
  29.     }
  30.   else errno = convert_oserr(IoErr());
  31.  
  32.   if (lock) UnLock(lock);
  33.   if (fib) FreeDosObject(DOS_FIB, fib);
  34.   return ret;
  35. }
  36.